package com.example.xiaoshuo_yudu.controller.admin;


import com.example.xiaoshuo_yudu.entity.Result;
import com.example.xiaoshuo_yudu.entity.dto.AdminUsersAddDTO;
import com.example.xiaoshuo_yudu.entity.dto.AdminUsersUpdateDTO;
import com.example.xiaoshuo_yudu.entity.entity.Users;
import com.example.xiaoshuo_yudu.service.AdminService;

import jakarta.validation.Valid;
import jakarta.validation.constraints.Max;
import jakarta.validation.constraints.Min;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

@RestController
@RequestMapping("/api/admin")
@Validated

public class AdminController {

    @Autowired
    private AdminService adminService;

    /**
     * 新增用户
     * @param user 新增用户DTO（包含用户名、邮箱等信息）
     * @return 操作结果
     */
    @PostMapping("/user/add")
    public Result<String> addUser(@RequestBody @Valid AdminUsersAddDTO user) {
        adminService.addUser(user);
        return Result.success("用户添加成功");
    }

    /**
     * 删除用户（使用DELETE方法符合REST规范）
     * @param userId 用户ID（与实体类保持Integer类型）
     * @return 操作结果
     */
    @DeleteMapping("/user/delete/{userId}")
    public Result<String> deleteUser(@PathVariable @Min(1) Integer userId) {
        // 检查是否尝试删除管理员账户
        Users user = adminService.getById(userId);
        if (user != null && user.getRole() == 3) {
            return Result.failure(400, "不能删除管理员账户");
        }
        
        adminService.deleteUser(userId); // 注意：需同步修改AdminService的deleteUser参数类型为Integer
        return Result.success("用户删除成功");
    }

    /**
     * 修改用户
     * @param user 更新用户DTO（需包含userId）
     * @return 操作结果
     */
   
    @PutMapping("/user/update") // 使用PUT方法表示更新资源
    public Result<String> updateUser(@RequestBody @Valid AdminUsersUpdateDTO user) {
        // 检查是否尝试禁用管理员账户
        Users existingUser = adminService.getById(user.getUserId());
        if (existingUser != null && existingUser.getRole() == 3 && user.getUserStatus() == 0) {
            return Result.failure(400, "不能禁用管理员账户");
        }
        
        // 需确保AdminUsersUpdateDTO已添加userId字段并加@NotNull校验
        adminService.updateUser(user);
        return Result.success("用户修改成功");
    }

    /**
     * 获取用户分页列表（使用GET方法查询资源）
     * @param keyword 搜索关键词（用户名/邮箱）
     * @param pageNum 页码（最小为1）
     * @param pageSize 每页条数（合理范围1-100）
     * @return 分页数据（列表+总数）
     */
    @GetMapping("/user/list")
    public Result<Map<String, Object>> list(
            @RequestParam(required = false) String keyword,
            @RequestParam(defaultValue = "1") @Min(1) Integer pageNum,
            @RequestParam(defaultValue = "10") @Min(1) @Max(100) Integer pageSize) {

        List<Users> users = adminService.getUserPage(keyword, pageNum, pageSize);
        int total = adminService.getUserCount(keyword);

        Map<String, Object> data = new HashMap<>(2);
        data.put("list", users);
        data.put("total", total);
        return Result.success(data);
    }

    /**
     * 获取单个用户信息（用于回显）
     * @param userId 用户ID（最小为1）
     * @return 用户详情
     */
    @GetMapping("/user/get")
    public Result<Users> getUser(@RequestParam @Min(1) Integer userId) { // 与实体类保持Integer类型
        Users user = adminService.getById(userId);
        return Result.success(user);
    }
    
    /**
     * 切换用户状态
     * @param userId 用户ID
     * @param status 目标状态
     * @return 操作结果
     */
    @PutMapping("/user/toggleStatus")
    public Result<String> toggleUserStatus(@RequestParam @Min(1) Integer userId, 
                                          @RequestParam @Min(0) @Max(1) Integer status) {
        // 检查是否尝试禁用管理员账户
        Users user = adminService.getById(userId);
        if (user != null && user.getRole() == 3 && status == 0) {
            return Result.failure(400, "不能禁用管理员账户");
        }
        
        adminService.toggleUserStatus(userId, status);
        return Result.success("用户状态更新成功");
    }
}